/*****************************************************************************
 * $LastChangedDate: 2009-11-22 22:39:11 -0500 (Sun, 22 Nov 2009) $
 * @file
 * @author  Jim E. Brooks  http://www.palomino3d.org
 * @brief   Base class for HUD objects.
 *//*
 * LEGAL:   COPYRIGHT (C) 2008 JIM E. BROOKS
 *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
 *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
 *****************************************************************************/

#define HUD_HUD_OBJECT_CC 1
#include "base/module.hh"
#include "base/event.hh"
using namespace base;
#include "gfx/module.hh"
#include "gfx/osg.hh"
using namespace gfx;
#include "graph/module.hh"
using namespace graph;
#include "view/module.hh"
#include "view/events.hh"
#include "view/window.hh"
using namespace view;
#include "hud/module.hh"
#include "hud/hud_object.hh"

namespace hud {

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////  HudObject  ///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

/*****************************************************************************
 * ctor/dtor.
 *****************************************************************************/
HudObject::HudObject( void )
:   mWindowPostDrawListener(new HudObject::WindowPostDrawListener(*this))
{
    SET_TYPESIG(this,TYPESIG_HUD_OBJECT);

    // Register function to be called after end of entire frame.
    EVENT_VIEW_POST_DRAW_ALL_VIEWS.Listen( mWindowPostDrawListener );
}

HudObject::~HudObject()
{
    // Unregister.
    EVENT_VIEW_POST_DRAW_ALL_VIEWS.Unlisten( mWindowPostDrawListener );

    INVALIDATE_TYPESIG(this,TYPESIG_HUD_OBJECT);
}

////////////////////////////////////////////////////////////////////////////////
////////////////////  HudObject::WindowPostDrawListener  ///////////////////////
////////////////////////////////////////////////////////////////////////////////

/*****************************************************************************
 * Reflect.
 *****************************************************************************/
void
HudObject::WindowPostDrawListener::operator()( Void nothing )
{
CHECK_TYPESIG(&mHudObject,TYPESIG_HUD_OBJECT);

    // ASSUMPTION: only main view needs a HUD.
    mHudObject.Update( *GET_WINDOW().GetMainView() );
}

} // namespace hud
